package com.powernode.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * rabbitmq 消息生产者端消息确认的配置
 */
@Component
@Slf4j
public class RabbitTemplateConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {
    /**
     * 确认消息是否成功从消息生产者发送到交换机
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {

        // ack为true时表示消息成功从生产者发送到交换机
        if (ack) {
            log.info("消息成功发送到交换机");
        }else {
            log.error("消息未成功发送到交换机，消息id：{}，原因：{}",correlationData.getId(),cause);
        }
    }


    /**
     * 消息未成功从交换机投递到队列时自动调用的方法
     */
    @Override
    public void returnedMessage(ReturnedMessage returned) {
        System.out.println(returned.getMessage().getBody());
        // TODO 将未发送成功的消息记录下来，比如记录到数据库，后续以定时任务的方式或人工进行处理
        log.error("消息未成功从交换机投递到队列");
    }
}
